stringfilter: Make the constructor take an expression
authorBenjamin Otte <otte@redhat.com>
Sun, 12 Jul 2020 05:02:04 +0000 (07:02 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 16 Jul 2020 18:43:16 +0000 (20:43 +0200)
An expression is critically important for a string filter and people
should be made aware of it when constructing the filter.

demos/gtk-demo/listview_settings.c
demos/gtk-demo/listview_words.c
gtk/gtkdropdown.c
gtk/gtkprintunixdialog.c
gtk/gtkstringfilter.c
gtk/gtkstringfilter.h
gtk/inspector/prop-list.c
testsuite/gtk/expression.c
testsuite/gtk/filter.c
testsuite/gtk/filterlistmodel-exhaustive.c

index 3c0de54d9fc5866b77fefae011f7e6ec467eb639..7dc55ada2fa9f77bc6febeb9111d084ce9adb859 100644 (file)
@@ -215,7 +215,6 @@ transform_settings_to_keys (GBinding     *binding,
   GtkFilterListModel *filter_model;
   GtkFilter *filter;
   GtkNoSelection *selection_model;
-  GtkExpression *expression;
   char **keys;
   guint i;
 
@@ -246,11 +245,8 @@ transform_settings_to_keys (GBinding     *binding,
                                         gtk_column_view_get_sorter (GTK_COLUMN_VIEW (data)));
   g_object_unref (store);
 
-  expression = gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name");
-  filter = gtk_string_filter_new ();
-  gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expression);
+  filter = gtk_string_filter_new (gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name"));
   filter_model = gtk_filter_list_model_new (G_LIST_MODEL (sort_model), filter);
-  gtk_expression_unref (expression);
   g_object_unref (sort_model);
 
   g_set_object (&current_filter, filter);
index be556696cf7cefb6f5e3a196bdcab6dc64ee8d6d..95664ed27961f33321676f4dd54e668848167c6d 100644 (file)
@@ -160,7 +160,6 @@ do_listview_words (GtkWidget *do_widget)
       GtkNoSelection *selection;
       GtkStringList *stringlist;
       GtkFilter *filter;
-      GtkExpression *expression;
       GFile *file;
 
       file = g_file_new_for_path ("/usr/share/dict/words");
@@ -177,10 +176,7 @@ do_listview_words (GtkWidget *do_widget)
           g_strfreev (words);
         }
 
-      filter = gtk_string_filter_new ();
-      expression = gtk_property_expression_new (GTK_TYPE_STRING_OBJECT, NULL, "string");
-      gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expression);
-      gtk_expression_unref (expression);
+      filter = gtk_string_filter_new (gtk_property_expression_new (GTK_TYPE_STRING_OBJECT, NULL, "string"));
       filter_model = gtk_filter_list_model_new (G_LIST_MODEL (stringlist), filter);
       gtk_filter_list_model_set_incremental (filter_model, TRUE);
 
index f89fb11391cc3e1cb4438582e6a6faaad5d1932f..de1ba763cb6ec256373e718d0b65b13e8a42e248 100644 (file)
@@ -205,9 +205,8 @@ update_filter (GtkDropDown *self)
 
       if (self->expression)
         {
-          filter = gtk_string_filter_new ();
+          filter = gtk_string_filter_new (gtk_expression_ref (self->expression));
           gtk_string_filter_set_match_mode (GTK_STRING_FILTER (filter), GTK_STRING_FILTER_MATCH_MODE_PREFIX);
-          gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), self->expression);
         }
       else
         filter = gtk_every_filter_new ();
index dab4548b495e70ba359ada9b04eec2eb9dd58570..681dc0427204ab684b7971fdca6833667523e89d 100644 (file)
@@ -744,7 +744,6 @@ gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog)
   GtkSorter *sorter;
   GtkFilter *filter;
   GtkFilter *filter1;
-  GtkExpression *expression;
   GtkListItemFactory *factory;
   GListStore *store;
   GListModel *paper_size_list;
@@ -819,15 +818,13 @@ gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog)
 
   filter = gtk_every_filter_new ();
 
-  filter1 = gtk_string_filter_new ();
+  filter1 = gtk_string_filter_new (
+                gtk_cclosure_expression_new (G_TYPE_STRING,
+                                             NULL, 0, NULL,
+                                             G_CALLBACK (get_printer_key),
+                                             NULL, NULL));
   gtk_string_filter_set_match_mode (GTK_STRING_FILTER (filter1), GTK_STRING_FILTER_MATCH_MODE_SUBSTRING);
   gtk_string_filter_set_ignore_case (GTK_STRING_FILTER (filter1), TRUE);
-  expression = gtk_cclosure_expression_new (G_TYPE_STRING,
-                                            NULL, 0, NULL,
-                                            G_CALLBACK (get_printer_key),
-                                            NULL, NULL);
-  gtk_string_filter_set_expression (GTK_STRING_FILTER (filter1), expression);
-  gtk_expression_unref (expression);
   gtk_multi_filter_append (GTK_MULTI_FILTER (filter), filter1);
 
   filter1 = gtk_custom_filter_new (is_printer_active, dialog, NULL);
index 3fa924e9c35a0799eb69bfc0dd8db2929a3dbf43..df45fe4f2a78be5ecf5c972d194165effc0e7526 100644 (file)
@@ -302,7 +302,9 @@ gtk_string_filter_init (GtkStringFilter *self)
 }
 
 /**
- * gtk_string_filter_new:
+ * gtk_s tring_filter_new:
+ * @expression: (transfer full) (nullable): The expression to evaluate
+ *     or %NULL for none
  *
  * Creates a new string filter.
  *
@@ -312,9 +314,17 @@ gtk_string_filter_init (GtkStringFilter *self)
  * Returns: a new #GtkStringFilter
  **/
 GtkFilter *
-gtk_string_filter_new (void)
+gtk_string_filter_new (GtkExpression *expression)
 {
-  return g_object_new (GTK_TYPE_STRING_FILTER, NULL);
+  GtkFilter *result;
+
+  result = g_object_new (GTK_TYPE_STRING_FILTER,
+                         "expression", expression,
+                         NULL);
+
+  g_clear_pointer (&expression, gtk_expression_unref);
+
+  return result;
 }
 
 /**
index 2c5e866bac33b508eacd923b0aa2507db3693539..fece96e7aeebeb8178e53fd31ee75dffe99054d0 100644 (file)
@@ -51,7 +51,7 @@ GDK_AVAILABLE_IN_ALL
 G_DECLARE_FINAL_TYPE (GtkStringFilter, gtk_string_filter, GTK, STRING_FILTER, GtkFilter)
 
 GDK_AVAILABLE_IN_ALL
-GtkFilter *             gtk_string_filter_new                   (void);
+GtkFilter *             gtk_string_filter_new                   (GtkExpression          *exporession);
 
 GDK_AVAILABLE_IN_ALL
 const char *            gtk_string_filter_get_search            (GtkStringFilter        *self);
@@ -69,10 +69,10 @@ GDK_AVAILABLE_IN_ALL
 void                    gtk_string_filter_set_ignore_case       (GtkStringFilter        *self,
                                                                  gboolean                ignore_case);
 GDK_AVAILABLE_IN_ALL
-GtkStringFilterMatchMode gtk_string_filter_get_match_mode   (GtkStringFilter          *self);
+GtkStringFilterMatchMode gtk_string_filter_get_match_mode       (GtkStringFilter        *self);
 GDK_AVAILABLE_IN_ALL
-void                     gtk_string_filter_set_match_mode   (GtkStringFilter          *self,
-                                                             GtkStringFilterMatchMode  mode);
+void                     gtk_string_filter_set_match_mode       (GtkStringFilter        *self,
+                                                                 GtkStringFilterMatchMode mode);
 
 
 
index 44a3e8ce0b60591666120724d107aa155be877b7..b30fe7a740341f7d322ce6050301427d21a7a0e5 100644 (file)
@@ -113,7 +113,7 @@ gtk_inspector_prop_list_init (GtkInspectorPropList *pl)
 
   pl->priv = gtk_inspector_prop_list_get_instance_private (pl);
   gtk_widget_init_template (GTK_WIDGET (pl));
-  pl->priv->filter = gtk_string_filter_new ();
+  pl->priv->filter = gtk_string_filter_new (NULL);
   gtk_string_filter_set_match_mode (GTK_STRING_FILTER (pl->priv->filter), GTK_STRING_FILTER_MATCH_MODE_SUBSTRING);
 
   sorter = gtk_string_sorter_new (gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
index 08b6e4d97dcb86334725e9ac4b5507219eda3c65..d5a8a0780246c7fefa8aaf7d1eebe1921dbca0b1 100644 (file)
@@ -38,7 +38,7 @@ test_property (void)
   GtkStringFilter *filter;
   guint counter = 0;
 
-  filter = GTK_STRING_FILTER (gtk_string_filter_new ());
+  filter = GTK_STRING_FILTER (gtk_string_filter_new (NULL));
   expr = gtk_property_expression_new (GTK_TYPE_STRING_FILTER, NULL, "search");
   watch = gtk_expression_watch (expr, filter, inc_counter, &counter, NULL);
 
@@ -83,7 +83,7 @@ test_closure (void)
   GtkStringFilter *filter;
   guint counter = 0;
 
-  filter = GTK_STRING_FILTER (gtk_string_filter_new ());
+  filter = GTK_STRING_FILTER (gtk_string_filter_new (NULL));
   pexpr[0] = gtk_property_expression_new (GTK_TYPE_STRING_FILTER, NULL, "search");
   pexpr[1] = gtk_property_expression_new (GTK_TYPE_STRING_FILTER, NULL, "ignore-case");
   pexpr[2] = gtk_property_expression_new (GTK_TYPE_STRING_FILTER, NULL, "match-mode");
@@ -156,7 +156,7 @@ test_object (void)
   GValue value = G_VALUE_INIT;
   gboolean res;
 
-  obj = G_OBJECT (gtk_string_filter_new ());
+  obj = G_OBJECT (gtk_string_filter_new (NULL));
 
   expr = gtk_object_expression_new (obj);
   g_assert_true (!gtk_expression_is_static (expr));
@@ -200,7 +200,7 @@ test_nested (void)
   GtkExpressionWatch *watch;
   guint counter = 0;
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "word");
   list = G_LIST_MODEL (g_list_store_new (G_TYPE_OBJECT));
   filtered = gtk_filter_list_model_new (list, filter);
@@ -231,7 +231,7 @@ test_nested (void)
   g_assert_cmpint (counter, ==, 0);
 
   g_clear_object (&filter);
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "salad");
   gtk_filter_list_model_set_filter (filtered, filter);
   g_assert_cmpint (counter, ==, 1);
@@ -289,7 +289,7 @@ test_nested_this_destroyed (void)
   GtkExpressionWatch *watch;
   guint counter = 0;
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "word");
   list = G_LIST_MODEL (g_list_store_new (G_TYPE_OBJECT));
   filtered = gtk_filter_list_model_new (list, filter);
@@ -308,7 +308,7 @@ test_nested_this_destroyed (void)
   g_clear_object (&filter);
   g_assert_cmpint (counter, ==, 0);
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "salad");
   gtk_filter_list_model_set_filter (filtered, filter);
   g_assert_cmpint (counter, ==, 1);
@@ -373,10 +373,10 @@ test_this (void)
 
   expr = gtk_property_expression_new (GTK_TYPE_STRING_FILTER, NULL, "search");
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "word");
 
-  filter2 = gtk_string_filter_new ();
+  filter2 = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter2), "sausage");
 
   res = gtk_expression_evaluate (expr, filter, &value);
@@ -429,11 +429,11 @@ test_bind (void)
 
   expr = gtk_property_expression_new (GTK_TYPE_STRING_FILTER, NULL, "search");
 
-  target = gtk_string_filter_new ();
+  target = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (target), "word");
   g_assert_cmpstr (gtk_string_filter_get_search (GTK_STRING_FILTER (target)), ==, "word");
 
-  source = gtk_string_filter_new ();
+  source = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (source), "sausage");
 
   watch = gtk_expression_bind (expr, target, "search", source);
@@ -468,7 +468,7 @@ test_bind_self (void)
                                       NULL,
                                       "ignore-case");
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "word");
   g_assert_cmpstr (gtk_string_filter_get_search (GTK_STRING_FILTER (filter)), ==, "word");
 
@@ -491,7 +491,7 @@ test_bind_child (void)
                                       NULL,
                                       "filter");
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   child = gtk_filter_list_model_new (NULL, NULL);
   gtk_filter_list_model_set_filter (child, filter);
   target = gtk_filter_list_model_new (G_LIST_MODEL (child), NULL);
@@ -501,7 +501,7 @@ test_bind_child (void)
   gtk_expression_bind (expr, target, "filter", child);
   g_assert_true (gtk_filter_list_model_get_filter (child) == gtk_filter_list_model_get_filter (target));
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   gtk_filter_list_model_set_filter (child, filter);
   g_assert_true (filter == gtk_filter_list_model_get_filter (target));
   g_assert_true (gtk_filter_list_model_get_filter (child) == gtk_filter_list_model_get_filter (target));
@@ -524,7 +524,7 @@ test_nested_bind (void)
   gboolean res;
   GValue value = G_VALUE_INIT;
 
-  filter2 = gtk_string_filter_new ();
+  filter2 = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter2), "sausage");
 
   list = G_LIST_MODEL (g_list_store_new (G_TYPE_OBJECT));
@@ -535,7 +535,7 @@ test_nested_bind (void)
                                              "filter");
   expr = gtk_property_expression_new (GTK_TYPE_STRING_FILTER, gtk_expression_ref (filter_expr), "search");
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "word");
   g_assert_cmpstr (gtk_string_filter_get_search (GTK_STRING_FILTER (filter)), ==, "word");
 
@@ -544,7 +544,7 @@ test_nested_bind (void)
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter2), "sausage");
   g_assert_cmpstr (gtk_string_filter_get_search (GTK_STRING_FILTER (filter)), ==, "sausage");
 
-  filter3 = gtk_string_filter_new ();
+  filter3 = gtk_string_filter_new (NULL);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter3), "banana");
   gtk_filter_list_model_set_filter (filtered, filter3);
 
@@ -599,8 +599,8 @@ test_double_bind (void)
   GtkExpression *filter_expr;
   GtkExpression *params[2];
 
-  filter1 = GTK_STRING_FILTER (gtk_string_filter_new ());
-  filter2 = GTK_STRING_FILTER (gtk_string_filter_new ());
+  filter1 = GTK_STRING_FILTER (gtk_string_filter_new (NULL));
+  filter2 = GTK_STRING_FILTER (gtk_string_filter_new (NULL));
 
   filter_expr = gtk_object_expression_new (G_OBJECT (filter1));
 
@@ -640,9 +640,9 @@ test_binds (void)
   GtkExpression *filter2_expr;
   GtkExpression *params[2];
 
-  filter1 = GTK_STRING_FILTER (gtk_string_filter_new ());
-  filter2 = GTK_STRING_FILTER (gtk_string_filter_new ());
-  filter3 = GTK_STRING_FILTER (gtk_string_filter_new ());
+  filter1 = GTK_STRING_FILTER (gtk_string_filter_new (NULL));
+  filter2 = GTK_STRING_FILTER (gtk_string_filter_new (NULL));
+  filter3 = GTK_STRING_FILTER (gtk_string_filter_new (NULL));
 
   filter1_expr = gtk_object_expression_new (G_OBJECT (filter1));
   filter2_expr = gtk_object_expression_new (G_OBJECT (filter2));
@@ -693,7 +693,7 @@ test_bind_object (void)
   GtkFilterListModel *model;
   GtkExpression *expr;
 
-  filter = gtk_string_filter_new ();
+  filter = gtk_string_filter_new (NULL);
   store = g_list_store_new (G_TYPE_OBJECT);
   model = gtk_filter_list_model_new (G_LIST_MODEL (store), NULL);
 
index 5c5fd707c79b1ff078b0ccb22571c8a41024a59b..09b2ca346de04174fc045e6dcfef7d3fa0ca3429 100644 (file)
@@ -249,16 +249,13 @@ test_string_simple (void)
 {
   GtkFilterListModel *model;
   GtkFilter *filter;
-  GtkExpression *expr;
 
-  expr = gtk_cclosure_expression_new (G_TYPE_STRING,
-                                      NULL,
-                                      0, NULL,
-                                      G_CALLBACK (get_string),
-                                      NULL, NULL);
-
-  filter = gtk_string_filter_new ();
-  gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expr);
+  filter = gtk_string_filter_new (
+               gtk_cclosure_expression_new (G_TYPE_STRING,
+                                            NULL,
+                                            0, NULL,
+                                            G_CALLBACK (get_string),
+                                            NULL, NULL));
 
   model = new_model (20, filter);
   assert_model (model, "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20");
@@ -268,7 +265,6 @@ test_string_simple (void)
 
   g_object_unref (model);
   g_object_unref (filter);
-  gtk_expression_unref (expr);
 }
 
 static void
@@ -276,16 +272,13 @@ test_string_properties (void)
 {
   GtkFilterListModel *model;
   GtkFilter *filter;
-  GtkExpression *expr;
-
-  expr = gtk_cclosure_expression_new (G_TYPE_STRING,
-                                      NULL,
-                                      0, NULL,
-                                      G_CALLBACK (get_spelled_out),
-                                      NULL, NULL);
 
-  filter = gtk_string_filter_new ();
-  gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expr);
+  filter = gtk_string_filter_new (
+               gtk_cclosure_expression_new (G_TYPE_STRING,
+                                            NULL,
+                                            0, NULL,
+                                            G_CALLBACK (get_spelled_out),
+                                            NULL, NULL));
 
   model = new_model (1000, filter);
   gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "thirte");
@@ -311,7 +304,6 @@ test_string_properties (void)
 
   g_object_unref (model);
   g_object_unref (filter);
-  gtk_expression_unref (expr);
 }
 
 static void
index 4bf54c1d571540a19b2a06f17391a89592e62b9e..76d2a9dd4c95ed6d54a02a4628f0fc0b4cc30856 100644 (file)
@@ -206,17 +206,16 @@ static GtkFilter *
 create_filter (gsize id)
 {
   GtkFilter *filter;
-  GtkExpression *expr;
 
   switch (id)
   {
     case 0:
       /* GTK_FILTER_MATCH_ALL */
-      return gtk_string_filter_new ();
+      return gtk_string_filter_new (NULL);
 
     case 1:
       /* GTK_FILTER_MATCH_NONE */
-      filter = gtk_string_filter_new ();
+      filter = gtk_string_filter_new (NULL);
       gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "does not matter, because no expression");
       return filter;
 
@@ -224,10 +223,7 @@ create_filter (gsize id)
     case 3:
     case 4:
       /* match all As, Bs and nothing */
-      filter = gtk_string_filter_new ();
-      expr = gtk_property_expression_new (GTK_TYPE_STRING_OBJECT, NULL, "string");
-      gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expr);
-      gtk_expression_unref (expr);
+      filter = gtk_string_filter_new (gtk_property_expression_new (GTK_TYPE_STRING_OBJECT, NULL, "string"));
       if (id == 2)
         gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "A");
       else if (id == 3)